﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SviluppoDistinta.Library
{
    public partial class Ordine
    {
        private Dictionary<Colore, Dictionary<Taglia, int>> _DictNumeroCapi;

        public int MaxX { get; private set; }
        public int MaxY { get; private set; }
        public List<int> RigheVuote = new List<int>();

        public Ordine()
        {
        }

        public int NumeroTotCapi
        {
            get
            {
                int tot = 0;

                foreach (Dictionary<Taglia, int> dct in _DictNumeroCapi.Values)
                {
                    foreach (int num in dct.Values) tot += num;
                }

                return tot;
            }
        }

        public void SetNumeroCapi(Colore colore, Taglia taglia, int numeroCapi)
        {
            if (!Colori.Contains(colore)) throw new ArgumentException("Il colore non è presente nella lista colori dell'ordine", "colore");
            if (!Taglie.Contains(taglia)) throw new ArgumentException("La taglia non è presente nella lista taglie dell'ordine", "taglia");
            if (_DictNumeroCapi == null) _DictNumeroCapi = new Dictionary<Colore, Dictionary<Taglia, int>>();

            Dictionary<Taglia, int> dctColore;
            if (_DictNumeroCapi.ContainsKey(colore))
                dctColore = _DictNumeroCapi[colore];
            else
            {
                dctColore = new Dictionary<Taglia, int>();
                _DictNumeroCapi.Add(colore, dctColore);
            }

            if (dctColore.ContainsKey(taglia)) dctColore[taglia] = numeroCapi;
            else dctColore.Add(taglia, numeroCapi);
        }

        public int GetNumeroCapi(Colore colore, Taglia taglia)
        {
            if (!Colori.Contains(colore)) throw new ArgumentException("Il colore non è presente nella lista colori dell'ordine", "colore");
            if (!Taglie.Contains(taglia)) throw new ArgumentException("La taglia non è presente nella lista taglie dell'ordine", "taglia");
            if (_DictNumeroCapi == null) return 0;

            if (_DictNumeroCapi.ContainsKey(colore))
            {
                Dictionary<Taglia, int> dctColore = _DictNumeroCapi[colore];
                if (dctColore.ContainsKey(taglia)) return dctColore[taglia];
                else return 0;
            }
                else
            {
                return 0;
            }
        }


        public void SviluppaPacchi()
        {
            int k = 0;  // contatore pacchi
            int x = 0;  // x-pos pacco per la distinta
            int y = 0;  // y-pos pacco per la distinta, numero totale righe distinta pacchi
            int r = 0;  // num tot di colonne per la distinta pacchi
            //int tempNumPezzi = 0;
            k = 0; x = 0; y = 0; r = 0;

            

            this.Pacchi.Clear();

            //int arrot = 5;      // arrotondamento capi/pacco
            //int divs = 3;      // divisore x quantità min/max pacco

            foreach (Colore colore in this.Colori)
            {
                foreach (Taglia taglia in this.Taglie)
                {
                    int numCapi = this.GetNumeroCapi(colore, taglia);
                    bool inseritoPrimo = false;

                    List<int> serieGruppiCapi = new List<int>();

                    int numPacchi = (int)Math.Round( (double)numCapi / (double)this.CapiPerGruppo );
                    numPacchi = Math.Max(1, numPacchi);

                    for (int i = 1; i <= numPacchi; i++)
                    {
                        if (i == numPacchi)
                            serieGruppiCapi.Add(numCapi - serieGruppiCapi.Sum());
                        else
                            serieGruppiCapi.Add(this.CapiPerGruppo);

                    }

                    foreach (Parte parte in Articolo.Parti)
                    {
                        int totPezzi = numCapi * parte.NumeroNecessario / parte.PerNumeroCapi;
                        if (totPezzi > 0) y++;
                        int tempPacchi = 0;

                        for (int index = 0; index < serieGruppiCapi.Count(); )
                        {
                            int NumPezziPacco = 0;
                            int pacchiTemp = serieGruppiCapi.Count() - tempPacchi;

                            for (int gru = 0; gru < Math.Min(parte.GruppiCapiPerPacco , pacchiTemp); gru++)
                            {
                                NumPezziPacco = NumPezziPacco + (serieGruppiCapi[index] * parte.NumeroNecessario / parte.PerNumeroCapi);
                                index++; tempPacchi++;
                            }

                            k++; x++;
                            r = Math.Max(r, x);

                            Pacco pacco = new Pacco(Articolo, colore, parte, taglia, NumPezziPacco, k, x, y);
                            this.Pacchi.Add(pacco);
                            if (!inseritoPrimo)
                            {
                                pacco.Primo = true;
                                inseritoPrimo = true;
                            }
                            else pacco.Primo = false;

                        }
                        //int pezziImpacchettati = 0;
                        //while (pezziImpacchettati < totPezzi)
                        //{
                        //    k++; x++;
                        //    int NumPezziPacco = (parte.PezziPerPacco * parte.NumeroNecessario / parte.PerNumeroCapi);
                        //    r = Math.Max(r, x);
                        //    int pezziRestanti = totPezzi - pezziImpacchettati;

                        //    if (pezziRestanti < (NumPezziPacco * 2) && (pezziRestanti > NumPezziPacco))
                        //    {
                        //        if ((pezziRestanti - NumPezziPacco) > ((NumPezziPacco / divs) + 2))
                        //        {
                        //            int tempArrot = arrot * parte.NumeroNecessario / parte.PerNumeroCapi;
                        //            tempNumPezzi = pezziRestanti / 2;
                        //            int resto = tempNumPezzi % tempArrot;
                        //            if (resto > 0)
                        //            {
                        //                tempNumPezzi = tempNumPezzi - (tempNumPezzi % tempArrot) + tempArrot;
                        //            }
                        //        }
                        //        else
                        //        {
                        //            tempNumPezzi = pezziRestanti;
                        //        }

                        //    }
                        //    else

                        //        tempNumPezzi = Math.Min(pezziRestanti, NumPezziPacco);

                        //    Pacco pacco = new Pacco(Articolo, colore, parte, taglia, tempNumPezzi, k, x, y, numCapi);
                        //    this.Pacchi.Add(pacco);
                        //    if (!inseritoPrimo)
                        //    {
                        //        pacco.Primo = true;
                        //        inseritoPrimo = true;
                        //    }
                        //    else pacco.Primo = false;
                        //    pezziImpacchettati += tempNumPezzi;


                        //}
                        x = 0;
                    }
                    RigheVuote.Add(y);
                }
            }

            this.MaxX = r;
            this.MaxY = y;


        }
    }
}
